package com.allwees.bs.c.module.product.mapper;

import com.google.common.collect.Lists;
import com.allwees.bs.c.module.base.mapper.IMapper;
import com.allwees.bs.c.module.merchant.dto.StoreDTO;
import com.allwees.bs.c.module.order.dto.OrderReviewItemDTO;
import com.allwees.bs.c.module.order.entity.OrderReviewItemEntity;
import com.allwees.bs.c.module.product.dto.ProductDetailsDTO;
import com.allwees.bs.c.module.product.dto.SkuDTO;
import com.allwees.bs.c.module.product.entity.ProductEntity;
import com.allwees.bs.c.module.product.entity.SkuEntity;
import com.allwees.bs.core.modelbase.page.PageParams;
import com.allwees.bs.core.modelbase.page.PaginateDTO;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;

@Component
public class ProductMapper implements IMapper<ProductDetailsDTO, ProductEntity> {
	protected static Logger logger = LoggerFactory.getLogger(ProductMapper.class);

	/**
	 * 简单转换商品信息，不包括额外对象信息，如店铺，SKU等
	 *
	 * @param entity
	 *            商品信息
	 * @return 商品信息
	 */
	@Override
	public ProductDetailsDTO entity2DTO(ProductEntity entity) {
		if(entity == null) {
			return null;
		}

		return new ProductDetailsDTO(entity);
	}

	/**
	 * 商品详情，包括商品自身信息，和下属的所有SKU列表信息
	 *
	 * @param entity
	 *            商品信息
	 * @param skuEntities
	 *            商品SKU列表
	 * @return 商品信息
	 */
	public ProductDetailsDTO entity2DTO(ProductEntity entity, List<SkuEntity> skuEntities) {
		if(entity == null) {
			return null;
		}

		ProductDetailsDTO productDetailsDTO = new ProductDetailsDTO(entity, true);

		this.assmbleSKU(productDetailsDTO, entity, skuEntities);

		return productDetailsDTO;
	}

	/**
	 * 转换商品列表，用在需要输出商品列表的情况下，包含商品所属店铺信息，不包括商品SKU信息
	 *
	 * @param entities
	 *            商品列表
	 * @param total
	 *            商品总数
	 * @param pageParams
	 *            分页参数
	 * @return 翻页商品列表对象
	 */
	public PaginateDTO<ProductDetailsDTO> entity2DTO(List<ProductEntity> entities, long total, PageParams pageParams) {
		if(entities == null) {
			return PaginateDTO.of(0, 0, pageParams);
		}

		PaginateDTO<ProductDetailsDTO> productsPaginateDTO = PaginateDTO.of(total, entities.size(), pageParams);
		List<ProductDetailsDTO> products = new ArrayList<>();
		entities.forEach(entity -> {
			ProductDetailsDTO product = new ProductDetailsDTO(entity);
			// 添加转换后的商店信息
			product.setStore(new StoreDTO(entity.getStore()));
			products.add(product);
		});
		productsPaginateDTO.setResults(products);

		return productsPaginateDTO;
	}

	public PaginateDTO<OrderReviewItemDTO> entity2DTO(Page<OrderReviewItemEntity> page, PageParams pageParams) {
		List<OrderReviewItemEntity> entities = page.getContent();
		long total = page.getTotalElements();
		PaginateDTO<OrderReviewItemDTO> pageResult;
		List<OrderReviewItemDTO> list = Lists.newArrayList();
		entities.forEach(entity -> {
			list.add(new OrderReviewItemDTO(entity));
		});
		pageResult = PaginateDTO.of(total, entities.size(), pageParams);
		pageResult.setResults(list);
		return pageResult;
	}

	public List<ProductDetailsDTO> entity2DTOWithoutStore(List<ProductEntity> entities) {
		List<ProductDetailsDTO> products = new ArrayList<>();
		entities.forEach(entity -> {
			ProductDetailsDTO product = new ProductDetailsDTO(entity);
			product.setStore(null);
			products.add(product);
		});
		return products;
	}

	private void assmbleSKU(ProductDetailsDTO productDetails, ProductEntity entity, List<SkuEntity> skus) {
		if(CollectionUtils.isEmpty(skus)){
			return;
		}

		BigDecimal maxRetailPrice = entity.getRetailPrice();
		BigDecimal minRetailPrice = entity.getRetailPrice();
		BigDecimal maxOriginalPrice = entity.getOriginalPrice();
		BigDecimal minOriginalPrice = entity.getOriginalPrice();

		LinkedHashSet<String> color = new LinkedHashSet<>();
		LinkedHashSet<String> size = new LinkedHashSet<>();
		List<SkuDTO> skuDtos = new ArrayList<>();

		for(SkuEntity skuEntity : skus) {
			SkuDTO sku = new SkuDTO(skuEntity);
			if (StringUtils.isNotBlank(skuEntity.getColor())) {
				color.add(skuEntity.getColor());
			}
			if (StringUtils.isNotBlank(skuEntity.getSize())) {
				size.add(skuEntity.getSize());
			}
			skuDtos.add(sku);

			maxRetailPrice = skuEntity.getRetailPrice().max(maxRetailPrice);
			minRetailPrice = skuEntity.getRetailPrice().min(minRetailPrice);
			maxOriginalPrice = skuEntity.getOriginalPrice().max(maxOriginalPrice);
			minOriginalPrice = skuEntity.getOriginalPrice().min(minOriginalPrice);
		}

		productDetails.getSkus().setColor(color);
		productDetails.getSkus().setSize(size);
		productDetails.getSkus().setSkus(skuDtos);

		productDetails.setMaxRetailPrice(maxRetailPrice);
		productDetails.setMinRetailPrice(minRetailPrice);
		productDetails.setMaxOriginalPrice(maxOriginalPrice);
		productDetails.setMinOriginalPrice(minOriginalPrice);
	}

}
